// 在MATLAB中，有一个非常有用的函数 reshape，它可以将一个矩阵重塑为另一个大小不同的新矩阵，但保留其原始数据。
// 给出一个由二维数组表示的矩阵，以及两个正整数r和c，分别表示想要的重构的矩阵的行数和列数。
// 重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。

// 如果具有给定参数的reshape操作是可行且合理的，则输出新的重塑矩阵；否则，输出原始矩阵。

const matrixReshape = function (nums: number[][], r: number, c: number): number[][] {
    const row = nums.length;
    const col = nums[0].length;
    const total = row * col;
    // 输入数据是否合理的检测
    if (total !== r * c) {
        return nums;
    }
    // 初始化结果数组
    const res: number[][] = new Array(r).fill(0).map(() => new Array(c).fill(0));
    // 把二维数组当作一维进行填充处理
    for (let i = 0; i < total; i++) {
        const currR = Math.floor(i / c); // 计算当前行
        const currC = i % c; // 计算当前列
        res[currR][currC] = nums[Math.floor(i / col)][i % col];
    }
    return res;
};

// 这道题目难度不大，主要可以学习处理矩阵变换的一些常见操作
// 首先判断reshape操作是否可行合理的方式比较容易，直接用元素总数判断即可
// 之后的操作需要用到一个常见的思维，那就是我们把二维数组实际上通过一维数组的方式来求解
// 怎么进行转换呢，实质上也就是需要计算变换矩阵前后的行和列
// 这里用到一个比较巧妙的向下取整和求余操作
// 对一个总计数指标除以列数向下取整就可以得到当前行
// 对一个总计数指标用列数求余就可以得到当前列
// 求出这两个指标后就可以很轻松的实现对新的二维数组的填充
